/*
 * @Description: 数组工具类
 * @Author: DHL
 * @Date: 2022-01-01 15:18:18
 * @LastEditors: DHL
 * @LastEditTime: 2023-02-15 10:01:38
 */

import { isArray, isString } from './isUtils'

/**
 * 序列化数组中指定属性
 * @param arr 数组
 * @param key 对象属性名
 * @returns
 */
export function arraySerialize<T>(arr: Array<any>, key: string): Array<T> {
  let rtn: any[] = []
  for (let item of arr) {
    const val = item[key]
    if (val && !rtn.includes(val)) {
      rtn.push(val)
    }
  }
  return rtn
}

/**
 * 序列化数组中指定属性为字符串
 * @param arr 数组
 * @param key 对象属性名
 * @returns
 */
export function arraySerializeToStr(arr: Array<any>, key: string): string {
  return arraySerialize(arr, key).join(',')
}

/**
 * 根据对象属性值，过滤数组
 * @param arr 数组
 * @param propertyName  属性名称
 * @param propertyValue 属性值
 * @param isLike 模糊匹配
 * @returns
 */
export function arrayFilter<T>(
  arr: Array<any>,
  propertyName: string,
  propertyValue: any,
  isLike = false
): Array<T> {
  let rtn: any[] = []
  for (let i = arr.length - 1; i >= 0; i--) {
    if (isLike) {
      if (arr[i][propertyName].indexOf(propertyValue) > -1) {
        rtn.push(arr[i])
      }
    } else {
      if (arr[i][propertyName] == propertyValue) {
        rtn.push(arr[i])
      }
    }
  }
  return rtn
}

/**
 * 删除数组中的某一项
 * @param arr
 * @param node
 */
export function arrayRemoveItem(arr: Array<any>, node: any) {
  const index = arr.indexOf(node)

  if (index > -1) {
    arr.splice(index, 1)
  }
}

/**
 * 根据对象属性值，删除数组
 * @param arr 数组
 * @param propertyName 属性名称
 * @param propertyValue 属性值
 */
export function arrayRemoveByPropertyValue(arr: any[], propertyName: string, propertyValue: any) {
  for (let i = arr.length - 1; i >= 0; i--) {
    if (arr[i][propertyName] == propertyValue) {
      arr.splice(i, 1)
    }
  }
}

/**
 * 获取最后一个值
 * @param arr
 */
export function arrayLastValue(arr: any) {
  if (isString(arr)) {
    return arr
  } else if (isArray(arr)) {
    return arr[arr.length - 1]
  }
  return null
}
